朴素贝叶斯

优点:在数据较少的情况下仍然有效,可以处理多类别问题
缺点:对输入数据的准备方式比较敏感
适用数据类型:标称型数据

贝叶斯准则

$$p(c|x)=\frac{p(x|c)p(c)}{p(x)}$$

朴素贝叶斯

假定特征之间独立,即计算条件概率时各个条件独立
则有\(p(x_0, x_1, x_2, ...|c_i)=p(x_0|c_i) \cdot p(x_1|c_i) \cdot p(x_2|c_i) \cdot ...\)

举例:侮辱性文档判定

假设存在一个文档,且其中每一句话都带有标签“侮辱性语句”或“非侮辱性语句”;
那么,我们可以通过“侮辱性语句”出现的频率来计算判定其为侮辱性文档的概率,即——
$$p(侮辱性文档)=\frac{侮辱性语句的数量}{总的语句数量}$$

训练

分别统计所有单词在“侮辱性语句”和“非侮辱性语句”中出现的频次;
并分别除以“侮辱性语句”和“非侮辱性语句”的总单词数,以此计算出“侮辱性语句”和“非侮辱性语句”中各个单词的条件概率\(p(x_i|c_j)\)
但存在两个问题——

零概率

如果出现部分单词没有出现,即存在条件概率\(p(x_i|c_j)=0\)
那么根据朴素贝叶斯公式,则有\(p(x_0, x_1, x_2, ...|c_i)=p(x_0|c_i) \cdot p(x_1|c_i) \cdot p(x_2|c_i) \cdot ...=0\)
改进方法如下:

  • 单词出现的频次初始化1而不是0
  • 语句中的总单词数初始化为2而不是0

此时不再会出现零条件概率

下溢出

多数单词的条件概率可能会非常小,甚至接近于0
而计算机的运算存在误差
当这些条件概率相乘时,有可能会得出0或者得出一个非常接近0的结果,而丢失很信息
改进方法如下:

  • 对条件概率取对数
    \(ln(a*b)=ln(a)+ln(b)\),相比于乘法,极小的数作为加法的影响会小的多
    而对数运算仍能保留原始信息的大部分特征

分类

已知一个语句,根据比较\(p(c_0|x_0, x_1, x_2, ...)\)和\(p(c_1|x_0, x_1, x_2, ...)\)判断其为“侮辱性语句”或“非侮辱性语句”(分别记为\(p_0\)和\(p_1\));
根据朴素贝叶斯
$$p(c_i|x_0, x_1, x_2, ...)=\frac{p(x_0, x_1, x_2, ...|c_i) \cdot p(c_i)}{p(x_0, x_1, x_2, ...)}=\frac{p(x_0|c_i) \cdot p(x_1|c_i) \cdot p(x_2|c_i) \cdot ... \cdot p(c_i)}{p(x_0, x_1, x_2, ...)}$$
由于分母相等,所以仅需比较两者的分子(记为\(num_0\)和\(num_1\))即可得到\(p_0\)和\(p_1\)的比较结果
训练时已经分别得到\(log(p(x_0|c_i)), log(p(x_1|c_i)), log(p(x_2|c_i)), ...\)以及\(p(c_i)\),
所以不妨比较\(log(num_0)\)和\(log(num_1)\),而
$$log(num_i)=log(p(x_0|c_i) \cdot p(x_1|c_i) \cdot p(x_2|c_i) \cdot ... \cdot p(c_i))=log(p(x_0|c_i))+log(p(x_1|c_i))+log(p(x_2|c_i))+...+log(p(c_i))$$

In [ ]: